package com.shuang.tree40;

public class LowestCommonAncestor {

    //递归 从下往上找（回溯） 后序遍历（左右中）就是天然的回溯过程，可以根据左右子树的返回值，来处理中节点的逻辑。
    public TreeNode lowestCommonAncestor(TreeNode root, TreeNode p, TreeNode q) {
        //终止条件：（回溯） 如果当前遇到的节点是目标值p 或者 q 或者空 直接返回当前节点  (包括当前节点可以是他自己祖先的情况了)
        if (root == null || root == p || root == q) {
            return root;
        }

        //要遍历整个树（因为要回溯 接住左右两棵树的值 再用在中 来做逻辑处理判断 ） 所以使用两个变量接住 左右递归结果

        //左
        TreeNode left = lowestCommonAncestor(root.left, p, q);
        //you
        TreeNode right = lowestCommonAncestor(root.right, p, q);

        //中接到回溯过来的结果开始处理逻辑
        if (left == null && right == null) {
            //说明左右子树都没找到未找到节点 p 或 q 返回空
            return null;
        } else if (left == null && right != null) {
            //说明在某个节点的右子树找到符合的节点了直接返回右节点
            return right;
        } else if (left != null && right == null) {
            return left;
        } else {
            //左右都不为空 返回当前节点就是题目要求
            return root;
        }
    }
}
